const state = require('@/config.js');
const CryptoJS = require('@/utils/md5.js');
const encryption = (params) => {
	var {
		data,
		type,
		param,
		key
	} = params

	const result = JSON.parse(JSON.stringify(data))

	if (type === 'Base64') {
		param.forEach(ele => {
			result[ele] = btoa(result[ele])
		})
	} else {
		param.forEach(ele => {
			var data = result[ele]
			key = CryptoJS.enc.Latin1.parse(key)
			var iv = key
			// 加密
			var encrypted = CryptoJS.AES.encrypt(
				data,
				key, {
					iv: iv,
					mode: CryptoJS.mode.CFB,
					padding: CryptoJS.pad.NoPadding
				})
			result[ele] = encrypted.toString()
		})
	}
	return result
}

module.exports = {

	// api 基础 url
	apiBaseUrl: state.apiUrl,

	// 调试模式 [ false 关闭调试输出，项目发包时请设置此项为 false ]
	debug: false,

	// 本地 Token 数据键名称
	localTokenKeyName: 'xjbg_1532',

	// 用户登录 Token 数据键名称
	userTokenKeyName: 'access_toke',

	tenantAppId: '1190805900588642304',

	// token 有效期, 单位 秒 ，要与后端保持一致
	expiredTime: 432000,

	// post 方式 header[content-type] 默认值
	postHeaderDefault: 'application/json;charset=UTF-8',

	// get 方式 header[content-type] 默认值
	getHeaderDefault: 'application/x-www-form-urlencoded;charset=UTF-8',

	// 从服务器获取 token 函数
	// 因后端语言不同、思路不同，请跟据自己的 api 情况完成 token 获取函数
	// 一个示例，实际开发请跟据自己情况复写此函数	
	getToken: function(resolve, reject) {
		let username = state.username();
		let password = state.password();
		if (!username || !password) {
			reject('请先登录！')
			return;
		}
		let u = encryption({
			data: {
				username,
				password,
				randomStr: "blockPuzzle",
			},
			key: 'pigxpigxpigxpigx',
			param: ['password']
		})

		// 发起请求
		uni.request({
			// token 授权 api 服务器地址
			url: `${state.apiUrl}/auth/oauth/token?grant_type=password`,
			// 请求秘钥
			data: {
				clientId: 'trainee',
				scope: 'server',
				username: u.username,
				password: u.password,
			},
			// 请求方式 POST
			method: "POST",
			// headers
			header: {
				isToken: false,
				'TENANT-ID': '20',
				'Authorization': 'Basic cGlnOnBpZw==',
				'content-type': 'application/x-www-form-urlencoded'
			},
			// 返回值类型
			dataType: "json",
			// 请求成功
			success: (res) => {
				if (res.statusCode == 200 && res.data) {
					resolve(res.data);
				} {
					reject(res.data.msg);
				}
			},
			// 请求失败
			fail: (e) => {
				reject(e);
			}
		});
	},
}
